package negocios;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/***
 * Classe que representa uma Caixa Postal do sistema I'm Here, para guardar as
 * mensagens dos usuarios. Implementa o padrao Iterator.
 * 
 * @author Jonathan Brilhante
 * @author Jose Rafael
 * @author Nata Venancio
 * @author Renato Almeida
 * 
 * @version 2.0
 */

public class CaixaPostal implements Iterable<Mensagem> {
	private static final String EXCLUIDA = "(X)";
	private static final String ATUAL = ">";
	private static final String NAO_LIDA = "(*)";
	private static final String SEP = System.getProperty("line.separator");

	private int indice;
	private List<Mensagem> mensagens;

	/**
	 * Constroi uma caixa postal.
	 */
	public CaixaPostal() {
		mensagens = new ArrayList<Mensagem>();
		indice = 0;
	}

	/**
	 * Retorna o numero de mensagens na caixa postal
	 * 
	 * @return O numero de mensagens na caixa postal
	 */
	public int numeroDeMensagens() {
		return mensagens.size();
	}

	/**
	 * Insere uma nova mensagem no final da caixa postal
	 * 
	 * @param m
	 *            a mensagem a inserir
	 */
	public void inserir(Mensagem m) {
		mensagens.add(m);
	}

	/**
	 * Retorna a mensagem do indice atual.
	 * 
	 * @return a mensagem do indice atual, null caso nao haja mensagem.
	 */
	public Mensagem mensagemAtual() {
		return indice >= 0 && indice < mensagens.size() ? mensagens.get(indice)
				: null;
	}

	/**
	 * Avanca o indice da caixa postal
	 */
	public void avancar() {
		indice = Math.min(indice + 1, numeroDeMensagens() - 1);
	}

	/**
	 * Recua o indice da caixa postal
	 */
	public void recuar() {
		indice = Math.max(indice - 1, 0);
	}

	/**
	 * Excluir/marcar como nao excluida a mensagem corrente da caixa postal. A
	 * mensagem sera marcada para ser excluida se nao estiver excluida, e
	 * marcada como nao excluida se tiver excluida, mas so sera excluida ao
	 * esvaziar a lixeira.
	 */
	public void excluir() {
		if (!mensagemAtual().isExcluida()) {
			mensagemAtual().excluir();
		} else {
			mensagemAtual().marcarNaoExcluida();
		}
	}

	/**
	 * Remove todas as mensagens marcadas para excluir
	 */
	public void esvaziaLixeira() {
		indice = 0;
		List<Mensagem> limpa = new ArrayList<Mensagem>();
		for (Mensagem m : mensagens) {
			if (!m.isExcluida()) {
				limpa.add(m);
			}
		}
		mensagens = limpa;
	}

	/**
	 * Retorna a representacao String da caixa de entrada
	 * 
	 * @return a representacao da Caixa Postal como string
	 */
	public String toString() {
		if (vazia()) {
			return "Caixa postal vazia.";
		}
		String retorno = "";
		int i = 0;
		for (Mensagem m : mensagens) {
			if (i == indice) {
				retorno += ATUAL + " ";
			}
			if (!m.isLida()) {
				retorno += NAO_LIDA + " ";
			}
			if (m.isExcluida()) {
				retorno += EXCLUIDA + " ";
			}
			retorno += m.getAssunto() + SEP;
			i++;
		}
		return retorno;
	}

	/**
	 * Responde se a caixa postal esta vazia.
	 * 
	 * @return true se o numero de mensagens for 0, false caso contrario.
	 */
	public boolean vazia() {
		return mensagens.isEmpty();
	}

	/**
	 * Retorna o iterador das mensagens da caixa postal
	 * 
	 * @return o iterador de mensagens.
	 */
	public Iterator<Mensagem> iterator() {
		return mensagens.iterator();
	}
}